﻿using System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;

namespace XRM.Security.WebUI.Helpers
{
    public class X509CertificateHelper
    {
        /// <summary>
        /// Пытаемся представить массив байт в виде сертификата. Массив может представлять сертификат в формате cer и p7b
        /// </summary>
        /// <param name="certByteArr">Массив байт, который будем пытаться представить в виде массива байт.</param>
        /// <param name="index">Порядковый номер сертификата (0 или 1) </param>
        /// <returns>Сертификат, который соответствует переданному массиву.</returns>
        /// <exception cref="System.Security.Cryptography.CryptographicException">Возникает в случае невозможности распарсить сертификат.</exception>
        public static X509Certificate2 Parse(byte[] certByteArr, int index)
        {
            X509Certificate2 certificate;
            var certContentType = X509Certificate2.GetCertContentType(certByteArr);
            if (certContentType == X509ContentType.Cert)
            {
                certificate = new X509Certificate2(certByteArr);
            }
            else
            {
                try
                {
                    var cms = new SignedCms();
                    cms.Decode(certByteArr);
                    if (index < cms.Certificates.Count)
                        certificate = cms.Certificates[index];
                    else
                        certificate = cms.Certificates[0];
                }
                catch (Exception)
                {
                    var s = System.Text.Encoding.ASCII.GetString(certByteArr);
                    var sr = new StringReader(s);
                    var line = sr.ReadLine();
                    var totalLine = string.Empty;
                    while (line != null)
                    {
                        if ((!line.Contains("BEGIN CERTIFICATE")) && (!line.Contains("END CERTIFICATE")))
                        {
                            totalLine = totalLine + line;
                        }
                        line = sr.ReadLine();
                    }
                    var decode = Convert.FromBase64String(totalLine);
                    var cms = new SignedCms();
                    cms.Decode(decode);
                    if (index < cms.Certificates.Count)
                        certificate = cms.Certificates[index];
                    else
                        certificate = cms.Certificates[0];
                }
            }
            return certificate;
        }

        public static string ParseSubject(string subject, string param)
        {
            string result = "";

            if (string.IsNullOrEmpty(subject))
                return result;

            string[] subjects = subject.Split(',');
            foreach (string s in subjects)
            {
                string[] paramValue = s.Trim().Split('=');
                if (paramValue.Length != 2)
                    continue;

                if (paramValue[0].ToUpper().Equals(param.ToUpper()))
                {
                    result = paramValue[1];
                    if ( result[0] == '"' )
                        result = result.Substring( 1, result.Length - 2 );
                    break;
                }
            }

            return result;
        }

    }
}